package main

import (
	"fmt"
	"log"
	"os"

	"github.com/mymmrac/telego"
)

func main() {
	bot, err := telego.NewBot(os.Getenv("TOKEN"), telego.WithDefaultLogger(true, true))

	if err != nil {
		log.Fatal(err)
	}

	user, err := bot.GetMe()

	if err != nil {
		log.Fatal(err)
	}

	updates, _ := bot.UpdatesViaLongPolling(nil)

	defer bot.StopLongPolling()

	for update := range updates {
		if update.InlineQuery != nil && update.InlineQuery.Query != "" {
			tips, err := GetTips(update.InlineQuery.Query)

			if err != nil {
				log.Print(err)
			}

			var results []telego.InlineQueryResult

			for i := 0; i < len(tips); i++ {
				results = append(results, &telego.InlineQueryResultArticle{
					Type:  "article",
					ID:    fmt.Sprintf("%d", i),
					Title: fmt.Sprintf("%s - %s", tips[i].Word, tips[i].Translation),
					URL:   fmt.Sprintf("https://wooordhunt.ru/word/%s", tips[i].Word),
					InputMessageContent: &telego.InputTextMessageContent{
						MessageText: fmt.Sprintf("%s - %s", tips[i].Word, tips[i].Translation),
					},
					ReplyMarkup: &telego.InlineKeyboardMarkup{
						InlineKeyboard: [][]telego.InlineKeyboardButton{
							{
								{
									Text: "🔗Подробнее🔗",
									URL:  fmt.Sprintf("https://wooordhunt.ru/word/%s", tips[i].Word),
								},
							},
						},
					},
				})
			}

			bot.AnswerInlineQuery(&telego.AnswerInlineQueryParams{
				InlineQueryID: update.InlineQuery.ID,
				Results:       results,
			})
		}
		if update.Message == nil || update.Message.Text == "" {
			continue
		}
		if update.Message.Text == "/start" || update.Message.Text == "/help" {
			bot.SendMessage(&telego.SendMessageParams{
				ChatID:             telego.ChatID{ID: update.Message.Chat.ID},
				Text:               fmt.Sprintf("👋Привет!\nЯ **неоффициальный** бот онлайн-словаря [WooordHunt.RU](https://woordhunt.ru/).\nОтправьте мне ваше слово на Англйском и я переведу его на Русский, или наоборот.\nЕщё я работаю в Inline-режиме: набери в любом чате [@%s](tg://%s) и через пробел ваше слово. Я подскажу вам перевод слова.", user.Username, user.Username),
				ParseMode:          "Markdown",
				LinkPreviewOptions: &telego.LinkPreviewOptions{IsDisabled: true},
			})
			continue
		}

		tips, err := GetTips(update.Message.Text)
		if err != nil {
			log.Print(err)
			bot.SendMessage(&telego.SendMessageParams{
				ChatID: telego.ChatID{ID: update.Message.Chat.ID},
				Text:   fmt.Sprintf("Не удалось получить данные, ошибка \"%s\". Попробуйте позже. Если проблема сохранится, напишите @Duo_sova.", err.Error()),
			})
			return
		}

		if len(tips) == 0 {
			bot.SendMessage(&telego.SendMessageParams{
				ChatID: telego.ChatID{ID: update.Message.Chat.ID},
				Text:   "Увы, слово не найдено в словаре. Проверьте, нет ли опечаток.",
			})
			return
		}

		var kb [][]telego.InlineKeyboardButton

		for i := 0; i < len(tips); i++ {
			kb = append(kb, []telego.InlineKeyboardButton{
				{
					Text: fmt.Sprintf("%s - %s", tips[i].Word, tips[i].Translation),
					URL:  fmt.Sprintf("https://wooordhunt.ru/word/%s", tips[i].Word),
				},
			})
		}

		bot.SendMessage(&telego.SendMessageParams{
			ChatID:             telego.ChatID{ID: update.Message.Chat.ID},
			Text:               "📃Возможные значения📃",
			ParseMode:          "Markdown",
			ReplyMarkup:        &telego.InlineKeyboardMarkup{InlineKeyboard: kb},
			LinkPreviewOptions: &telego.LinkPreviewOptions{IsDisabled: true},
		})
	}
}
